//
//  GNUserAccountViewModel.swift
//  SinaWeChat
//
//  Created by mac on 15/12/8.
//  Copyright © 2015年 mac. All rights reserved.
//







import UIKit

class GNUserAccountViewModel{
    
    //ViewModel
    var userAccount:GNUserAccount?
    
    //归档与解档
    
    var archivePath: String = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("useraccount.archive")
    
    //是否登录
    var userLogon: Bool {
        return accessToken != nil
    }
    
    
    //只读属性
    //返回当前用户的accessToken
    var accessToken:String? {
        
        // 从 userAccount 取出 accessToken
        // 如果没有 return nil
        // 如果取出来存在,还有得判断是否过期
        if let accessToken = userAccount?.access_token where !isExpires
        {
            //判断是否过期
            return accessToken
        }
        return nil
    }
    
    // 返回 true 代表过期, false 没有过期
    // 写 getOnly 的原因是代表,我们判断的 accessToken 是否过期是根据当前时间变化计算出来的
    var isExpires:Bool {
        
        guard let expiresDate = userAccount?.expiresDate else {
            
            return true
        }
        // 通过过期时间计算出比过期时间少1的时间
        //        let newDate = expiresDate.dateByAddingTimeInterval(0)
        
        // 当前时间与 expiresDate 进行对比
        // 如果当前时间 不大于 expiresDate 过期时间,是代表不过期:false
        
        if NSDate().compare(expiresDate) == NSComparisonResult.OrderedAscending{
            
            return false
        }
        
        return true
    }
    
    //全局访问点
    static let sharedAccount:GNUserAccountViewModel = GNUserAccountViewModel()
    
    //构造方法私有,外界不能直接通过 类名() 初始化对象
    private init(){
        
        //从归档里面解档
        userAccount = loadUserAccount()
        
        
    }
    
    
    
    
    
    
}


extension GNUserAccountViewModel{
    
    // MARK: - 获取 AccessToken 以及 获取用户的数据
    func loadAccessToken(code: String, complete:(isSuccessed: Bool)->()){
        
        //发送请求
        
        GNNetworkingTools.shareTools.loadAccessToken(code) { (response, error) -> () in
            
            if error != nil{
                print("请求错误:\(error)")
                
                return
            }
            
            //在强转的时候,`!` 与 `?` 怎么选,只要看前面的数据是否是一个可选值
            guard let dict = response as? [String:AnyObject] else{
                
                print("返回数据不是字典")
                return
            }
            
            let account = GNUserAccount(dict: dict)
            
            self.userAccount = account
            
            
            
            self.loadUserInfo(account.uid!, accessToken: account.access_token!, complete: complete)
            
            // 先得请求会数据,归档完毕在进行赋值解档
            //            complete(isSuccessed: true)
            
            
        }
    }
    
        //请求用户的数据
        
        private func loadUserInfo(uid: String, accessToken: String, complete:(isSuccessed: Bool)->()){
            
            //发送请求
            GNNetworkingTools.shareTools.loadUserInfo(uid, accessToken: accessToken) {(response, error) -> () in
                
                if error != nil{
                    
                    print("请求失败")
                    complete(isSuccessed: false)
                    return
                }
                
                print(response)
                
                //在if let 或者 guard let 里as都是用?
                
                guard let responseDict = response as? [String:AnyObject]
                    else{
                        
                        print("返回的不是一个字典")
                        return
                        
                }
                //赋值用户头像与昵称
                
                self.userAccount?.screen_name = responseDict["screen_name"] as? String
                
                self.userAccount?.avatar_large = responseDict["avatar_large"] as? String
                
                //保存
                self.saveAccount(self.userAccount!)
                complete(isSuccessed: true)
            }
            
            
            
        }
        
    
    
    
}
    //MARK:-归档御姐当方法
extension GNUserAccountViewModel {
        
        //归档当前对象
        
        //归档当前的对象
        func saveAccount(account:GNUserAccount) {
            
            //1.获取路径(最好分开写)
            //        let file = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("useraccount.archive")
            //
            //        print(file)
            
            // 2.归档(不是用Data那个)
            NSKeyedArchiver.archiveRootObject(account, toFile: archivePath)
        }
        
        
        
        
        //1.获取路径
        
        //        let file = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("useraccount.archive")
        //        
        //解档
        func loadUserAccount() -> GNUserAccount? {
            let result = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? GNUserAccount
            
            return result
        }
        
        
        
}


